


#include "Mass_Spring_Model.h"


Mass_Spring_Model::Mass_Spring_Model()
{


}

void Mass_Spring_Model::InicializarModelo()
{
    CrearNodos();
    CrearSprings();;
}

void Mass_Spring_Model::CrearNodos()
{
    for(unsigned int i=0;i<=(/*2*/intNroNodos);i++)
    {
        NodoFisico nodoTemp;

        objNodos.push_back(nodoTemp);	
    }
}

void Mass_Spring_Model::CrearSprings()
{
	for(unsigned int i=0;i<=(intNroSprings/*+intNroNodos*/);i++)
    {
        Spring spring;

        objSprings.push_back(spring);
    }
}



void Mass_Spring_Model::Calculate()
{
    double dblValorAlpha = 0.1;

    double dblfuerzaX;
    double dblfuerzaY;
    double dblfuerzaZ;

    double dblXTemp;
    double dblYTemp;
    double dblZTemp;

    intNroNodosModificados = 0;
    vNodosModificados.clear();

    for(unsigned int i=0 ;i < intNroNodos; i++)
    {
        dblfuerzaX = 0;
        dblfuerzaY = 0;
        dblfuerzaZ = 0;
                
        if(objNodos[i].getEstadoNodo()==NO_COLISION){
            for(int j=0; j <  objNodos[i].getNroConexionesSpring(); j++){

                if(i==objSprings[objNodos[i].getOneConSpring(j)].getIndice1())
                {
                    objSprings[objNodos[i].getOneConSpring(j)].setNodoCalculado(1);

                }
                else if(i==objSprings[objNodos[i].getOneConSpring(j)].getIndice2())
                {
                    objSprings[objNodos[i].getOneConSpring(j)].setNodoCalculado(2);
                }
                else
                {
                    throw new exception;
                }

                //Sumatoria Fij
                objSprings[objNodos[i].getOneConSpring(j)].CalcularFuerzaInterna();
				
                dblfuerzaX += objSprings[objNodos[i].getOneConSpring(j)].getFuerzaInterna().getX();
                dblfuerzaY += objSprings[objNodos[i].getOneConSpring(j)].getFuerzaInterna().getY();
                dblfuerzaZ += objSprings[objNodos[i].getOneConSpring(j)].getFuerzaInterna().getZ();
            }

            //xi = xi+alph*fi+mig
            dblXTemp = objNodos[i].getVertice()->getX()+dblValorAlpha*dblfuerzaX; //-objNodos[i].getMasa()*10.0;
            dblYTemp = objNodos[i].getVertice()->getY()+dblValorAlpha*dblfuerzaY; //-objNodos[i].getMasa()*10.0;
            dblZTemp = objNodos[i].getVertice()->getZ()+dblValorAlpha*dblfuerzaZ; //-objNodos[i].getMasa()*10.0;

            //Creando una lista de los nodos que fueron desplazados
            if(dblfuerzaX!=0.0 || dblfuerzaY!=0.0 || dblfuerzaZ!=0.0)
            {
                vNodosModificados.push_back(i);
                intNroNodosModificados++;
            }

            objNodos[i].getVertice()->setX(dblXTemp);
            objNodos[i].getVertice()->setY(dblYTemp);
            objNodos[i].getVertice()->setZ(dblZTemp);
        }
        else if(objNodos[i].getEstadoNodo()==CONDICION_FRONTERA)
        {
		
        }
        else if(objNodos[i].getEstadoNodo()==COLISION)
        {
            //Creando una lista de los nodos que fueron desplazados
            vNodosModificados.push_back(i);
            intNroNodosModificados++;
        }
        else
        {
            throw new exception;
        }
    }
}
